package com.sr.util;

import com.alibaba.fastjson.JSON;

import java.util.List;

/**
 * @author xiaochi
 * @date 2022/5/3 15:35
 * @desc CacheUtil
 */
public class CacheUtil {

    private static final byte[] lock = new byte[0];

    /**
     * 查询单个缓存
     * 查询单个缓存
     * @param key key
     * @param expired 缓存时长
     * @param clazz 实体类
     * @param expression 函数式
     * @param <T>
     * @return
     */
    public static <T>T cache(String key,Integer expired,Class<T> clazz,EntityCache<T> expression){
        T obj;
        String val = RedisUtil.get(key);
        if (val == null || "".equals(val)){
            // synchronized+双重检查机制 解决缓存击穿(缓存不存在，数据库存在)
            synchronized (lock){
                val = RedisUtil.get(key);
                if (val == null || "".equals(val)){
                    obj = expression.get();
                    if (null == obj){
                        RedisUtil.set(key,null,30);
                    }else {
                        RedisUtil.set(key, JSON.toJSONString(obj),expired);
                    }
                }else {
                    obj = JSON.parseObject(val,clazz);
                }
            }
        }else {
            obj = JSON.parseObject(val,clazz);
        }
        return obj;
    }

    /**
     * 查询集合缓存
     * @param key key
     * @param expired 缓存时长
     * @param clazz 实体类
     * @param expression 函数式
     * @param <T>
     * @return
     */
    public static <T>List<T> cache(String key,Integer expired,Class<T> clazz,ListCache<T> expression){
        List<T> list;
        String val = RedisUtil.get(key);
        if (val == null || "".equals(val)){
            synchronized (lock){
                val = RedisUtil.get(key);
                if (val == null || "".equals(val)){
                    list = expression.get();
                    if (list == null){
                        RedisUtil.set(key,null,30);
                    }else {
                        RedisUtil.set(key,JSON.toJSONString(list),expired);
                    }
                }else {
                    list = JSON.parseArray(val,clazz);
                }
            }
        }else {
            list = JSON.parseArray(val,clazz);
        }
        return list;
    }

    /**
     * 实体类型
     * @param <T>
     */
    @FunctionalInterface
    public interface EntityCache<T>{
        T get();
    }

    /**
     * 集合类型
     * @param <T>
     */
    @FunctionalInterface
    public interface ListCache<T>{
        List<T> get();
    }
}
